QT实战

您所在的位置:网站首页 qt new数组 QT实战

QT实战

2023-04-02 19:48| 来源: 网络整理| 查看: 265

[导读] 大家好,我是逸珺。

今天来聊一下QList,QList 是一种QT容器,如果能熟练使用它,会非常香。

什么是QList

QList 是QT中通用容器类,它将对象存储在一个表中,该表提供基于索引的快速访问和基于索引的插入和删除。熟悉C++标准库的话,就类似于std:list ,为什么这里描述是跟了一个呢?因为是容器类,所谓容器,就把它想象成一个能装东西的框,但是这与现实生活中的框还是有区别的,现实中的框可以随便往里面装东西,先装几个土豆,再放两颗白菜,再放一本书....,随便装,只要放的下。

但是这个容器类跟的这个,是指泛型,从字面意思上看,好像也是什么对象都可以往里面放,但是这么几层需要理解:

对于特定的容器,需要指明其可装进去的对象类型对于特定的容器,只能装指定的类型

那么,为什么又说是泛型呢?就是说不同的QList对象,根据所指定的T的类型,可以装各自不同类型的对象,比如:

QList m_list1; QList m_list2;

m_list1 对象可以存float型的对象,而m_list2则可以装int型对象。这是怎么做到的呢,是C++编译器在编译期绑定的。

前面说QList是基于索引插入和删除的容器类,何以见得呢?来看看QT官方文档例子:

QList list = { "one", "two", "three" };

这意味着这三个元素是这样放的:

QT实战例子

假设有这么一个需求,利用一个socket接收一个设备的计算数据,每一个计算数据是这样的:

typedef struct _t_measure{ qint64 addr; qint64 Real; qint64 Imag; qint64 rms; }t_measure;

在类中加入QList:

QList m_measure;

一个报文里面有多个测量结果,QT写的应用程序,需要一边收一边显示或者存储,接收可能是一个线程,或者sokect消息回调函数,比如是UDP接收的:

connect(m_MeasureUdpSocket, SIGNAL(readyRead()), this, SLOT(readMeasurement()));

接收函数:

#define MAX_BUF_SIZE (300) #define MAX_BUF_SIZE_BYTES (MAX_BUF_SIZE*8) void Measurement::readMeasurement() { typedef union _u_buf { char buf[MAX_BUF_SIZE_BYTES]; qint64 dpts[MAX_BUF_SIZE]; }u_buf; u_buf buffer; t_measure *pRaw=nullptr; int len = 0; while (m_MeasureUdpSocket->hasPendingDatagrams()) { len = m_MeasureUdpSocket->pendingDatagramSize(); if(len>MAX_BUF_SIZE_BYTES) len = MAX_BUF_SIZE_BYTES; m_MeasureUdpSocket->readDatagram(buffer.buf, len); if(buffer.dpts[0]==0x7FAAAAF7CCCCCCCC) { pRaw = (t_measure *)&buffer.dpts[2]; for(int i=0;i

接收端不断在尾部追加,而处理端则在头部取出,就是一个FIFO操作。

如果不使用QList,自己实现一个FIFO则需要考虑很多细节问题,所以使用C++,或者QT要尽量摆脱C语言的编程习惯,尽量使用已有的轮子,这会大大提高生产效率。

总结一下

使用C++,熟悉掌握容器这些泛型编程方法,不用自己去管理这些底层实现,会大大提高效率。我觉得蛮香,你觉得呢?

该文原创首发于:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3